#include "gm_sc_cont.h"

gm_sc_cont::gm_sc_cont(void)
{
	memset(_szName, 0, sizeof(_szName));
	init_handle(CONTAINER_HANDLE);
}
gm_sc_cont::gm_sc_cont(int id, char* szName, ULONG appId)
{
	_ulid = id;
	_ulAppId = appId;
	memset(_szName, 0, sizeof(_szName));
	strncpy(_szName, szName, 128);

	init_handle(CONTAINER_HANDLE);
}
gm_sc_cont::~gm_sc_cont(void)
{
	clear();
}


char * gm_sc_cont::Name()
{
	return _szName;
}
void gm_sc_cont::Name(char * val) 
{
	strncpy(_szName, val, 128); 
}

ULONG gm_sc_cont::id()
{
	return _ulid; 
}

gm_handle_mgr* gm_sc_cont::get_key_mgr() 
{ 
	return &sc_key_mgr; 
}

gm_handle_mgr *gm_sc_cont::get_mac_mgr() 
{
	return &sc_mac_mgr; 
}

ULONG gm_sc_cont::get_app_id()
{ 
	return _ulAppId; 
}

gm_sc_key * gm_sc_cont::find_key( HANDLE hkey )
{
	gm_handle_mgr *key_mgr = get_key_mgr();
	gm_handle * pkey = key_mgr->get_first_handle();
	while(pkey)
	{
		if(pkey->get_handle() == hkey)
		{
			return (gm_sc_key *)pkey;
		}

		pkey = key_mgr->get_next_handle();
	}

	return NULL;
}

gm_sc_mac * gm_sc_cont::find_mac( HANDLE hMac )
{
	gm_handle_mgr *mac_mgr = get_mac_mgr();
	gm_handle *pmac = mac_mgr->get_first_handle();
	while(pmac)
	{
		if(pmac->get_handle() == hMac)
		{
			return (gm_sc_mac*)pmac;
		}

		pmac = mac_mgr->get_next_handle();
	}

	return NULL;
}

gm_sc_key * gm_sc_cont::create_session_key( int session_id, ULONG alg_id )
{
	gm_sc_key * pKey = new gm_sc_key(session_id, _ulid, alg_id);
	sc_key_mgr.add_handle(pKey);
	
	return pKey;
}

void gm_sc_cont::clear()
{
	sc_key_mgr.clear();
	sc_mac_mgr.clear();
}

ULONG gm_sc_cont::remove_session_key( HANDLE hKey )
{
	return sc_key_mgr.remove_handle(hKey);
}

gm_sc_mac * gm_sc_cont::create_mac_key( int session_id, ULONG alg_id )
{
	gm_sc_mac *pmac = new gm_sc_mac(session_id, _ulid, alg_id);
	
	sc_mac_mgr.add_handle(pmac);

	return pmac;
}

ULONG gm_sc_cont::remove_mac_key( HANDLE hKey )
{
	return sc_mac_mgr.remove_handle(hKey);
}

gm_sc_key * gm_sc_cont::get_first_key()
{
	return (gm_sc_key *)sc_key_mgr.get_first_handle();
}

void gm_sc_cont::clear_keys()
{
	clear();
}
